package futbol.tacticas.concursantes.TacticaCansina;

import java.awt.Color;
import java.awt.Point;
import java.util.Hashtable;
import java.util.Vector;

import futbol.General;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;

public class TacticaCansina implements Tactica {
	int portero=0;
	private int nValores[][]={
							{-155,0,2,6},//1
							{-100,40,6,4},//2
							{-100,-40,6,4},//3
							{-100,0,6,4},//4
							{-80,-20,6,4},//5
							{-80,20,6,4},//6
							{-20,0,3,6},//7
							{40,90,3,6},//8
							{40,-90,3,6},//9
							{80,35,9,3},	//10						
							{90,-35,10,3}//11
							};
	public String getNombre() {
		// TODO Auto-generated method stub
		return "Cansinos";
	}

	public Color getColor1() {
		// TODO Auto-generated method stub
		return Color.WHITE;
	}

	public Color getColor2() {
		// TODO Auto-generated method stub
		return Color.WHITE;
	}

	public Color getColorNumero() {
		// TODO Auto-generated method stub
		return Color.BLACK;
	}

	public int getFuerza(int n) {
		// TODO Auto-generated method stub
		return nValores[n][2];
	}

	public int getXInicial(int n) {
		// TODO Auto-generated method stub
		return nValores[n][0];
	}

	public int getYInicial(int n) {
		// TODO Auto-generated method stub
		return nValores[n][1];
	}
	private Point bolaOld = new Point(0,0);
	private Point bolaNew = new Point(0,0);
	private Point interceptar160 = new Point(-158,0);
	private Point interceptar130 = new Point(-130,0);
	private Point bolaFuture = new Point(0,0);
	private Point bolaFuture2 = new Point(0,0);
	Point miequipoOld[] = null;
	Point miequipoNew[] = null;
	Point suequipoOld[] = null;
	Point suequipoNew[] = null;
	boolean puerta=false;
	int njug2=-1,njug1=-1,njug11=-1;
	public void setBolaNew(Point p){
		bolaOld=bolaNew;
		bolaNew=p;
	}
	public Point calcularPosicion(){
		Point p = new Point();
		double difX=bolaOld.getX() - bolaNew.getX();
		double difY=bolaOld.getY() - bolaNew.getY();
		p.x=new Double(bolaOld.getX()-(2*difX)).intValue();
		p.y=new Double(bolaOld.getY()-(2*difY)).intValue();
		bolaFuture2.x=new Double(bolaOld.getX()-(3*difX)).intValue();
		bolaFuture2.y=new Double(bolaOld.getY()-(3*difY)).intValue();
		if(Math.abs(p.getY())<=30 && p.getX()<-110){
			double diffX=bolaOld.getX() +100;
			double porcentaje=difX/diffX;
			double diffY=difY/porcentaje;
			int y = new Double(bolaOld.getY() - diffY).intValue();
			interceptar130.y=y;
			diffX=bolaOld.getX() +150;
			porcentaje=difX/diffX;
			diffY=difY/porcentaje;
			y = new Double(bolaOld.getY() - diffY).intValue();
			interceptar160.y=y;
			puerta=true;
		}else{
			puerta=false;
		}
		bolaFuture = p;
		return p;
	}
	int nPase =1;
	int paso=0;
	Hashtable totales =new Hashtable();
	Point puntoInterceptar=null;
	public int interceptarBola(){
		if(bolaOld!=null){
			double difX=bolaOld.getX() - bolaNew.getX();
			if(difX<0) return -1;
			double difY=bolaOld.getY() - bolaNew.getY();
			double distanciaInicial=General.getDistancia(bolaOld.getX(),bolaOld.getY(),bolaNew.getX(),bolaNew.getY());
			double distancia=distanciaInicial;
			double totalRecorrido=0;
			int pase=0;
			while (!(distancia<15)){
				pase++;
				distancia=distancia-1;
				totalRecorrido+=distancia;			
			}
			int j=-1;
			while(j==-1 && pase<19){
				double totalDifX=(difX*totalRecorrido)/distanciaInicial;
				double totalDifY=(difY*totalRecorrido)/distanciaInicial;
				Point posicion = new Point(new Double(bolaNew.getX()-totalDifX).intValue(),new Double(bolaNew.getY()-totalDifY).intValue());
				j=llega(posicion,pase);
				if(j==-1){
					pase++;
					distancia=distancia-1;
					totalRecorrido+=distancia;	
				} else {
					puntoInterceptar=posicion;
					return j;
				}
			}
		} 
		
		return -1;
		
	}
	public int llega(Point posicion, int iteracciones){
		int jug=-1;
		double queda=10;
		for (int i=0;i<11;i++){
			double distancia=General.getDistancia(miequipoNew[i].getX(),miequipoNew[i].getY(),posicion.getX(),posicion.getY());
			int recorre = iteracciones*nValores[i][3];
			if(distancia-recorre<queda){
				jug=i;
				queda=distancia-recorre;
			}				
		}
		return jug;
	}
	public Vector<Comando> getComandos(SituacionJugadores sj) {
		Hashtable asignado=new Hashtable();
		// TODO Auto-generated method stub
		Vector<Comando> comandos=new Vector();
        Hashtable h = new Hashtable();
        
        int nJug=sj.getMasCercanoDeBola();
		Point bola=sj.getBola();
		Point miequipo[] = sj.getMisJugadores();
		miequipoOld=miequipoNew;
		miequipoNew=miequipo;
        Point suequipo[] = sj.getContrario();
        Hashtable distancias=new Hashtable();
        
        suequipoOld=suequipoNew;
        suequipoNew=suequipo;
      
        int cJug=sj.getContrarioMasCerca(bola.getX(),bola.getY());
        int jmascerpos=jugadorPositivoMasCercano(miequipo,nJug);
        int jmascer=jugadorMasCercano(miequipo,nJug);
        double distanciaBola=General.getDistancia(0,0,bola.getX(),bola.getY());
        
        
        
       
        setBolaNew(bola);
        int jugador =interceptarBola();
        if(jugador!=-1){
        	comandos.add(new ComandoIrA(jugador, puntoInterceptar.getX(), puntoInterceptar.getY()));
        	comandos.add(new ComandoGolpearBola(jugador,puntoInterceptar.getX()+30,puntoInterceptar.getY()));	
        }
        Point futurBola = calcularPosicion();
      
        int jugmcp = mascercano(miequipo);
        
            
       
        	if(nJug!=portero && portero!=jugador){
	        	if(Math.abs(bola.getY())<=30){
	        		comandos.add(new ComandoIrA(portero, nValores[0][0], bola.getY()+nValores[0][1]));
	        	} else if(bola.getY()<-30){
	        		comandos.add(new ComandoIrA(portero, nValores[0][0], nValores[0][1]-30));
	        	} else {
	        		comandos.add(new ComandoIrA(portero, nValores[0][0], nValores[0][1]+30));
	        	}
	        	if(portero==nJug){
	        		comandos.add(new ComandoIrA(nJug,bola.getX(),bola.getY()));
	        	}
	        	
	        		comandos.add(despejar(bola, portero));
	        	
	        	nPase++;
        	}
		
        double disentre =General.getDistancia(miequipo[nJug].getX(),miequipo[nJug].getY(),suequipo[cJug].getX(),suequipo[cJug].getY());
    	double distanpos=General.getDistancia(miequipo[nJug].getX(),miequipo[nJug].getY(),miequipo[jmascerpos].getX(),miequipo[jmascerpos].getY());
    	double distan=General.getDistancia(miequipo[nJug].getX(),miequipo[nJug].getY(),miequipo[jmascer].getX(),miequipo[jmascer].getY());
    	comandos.add(new ComandoIrA(nJug,bola.getX(),bola.getY()));
    	h.put(nJug,new Integer(nJug));
    	double distanPortero=General.getDistancia(miequipo[0].getX(),miequipo[0].getY(),nValores[0][0],nValores[0][1]);
    	if(nJug==portero || distanPortero>40){
    		portero=3;    		
    	} else if(portero==3){
    		portero=0;
    	}
    	asignado.put(portero,"portero");
	    	if(nJug==9 || nJug==10 ){
	    		if(Math.abs(bola.getX())<10 && Math.abs(bola.getY())<10){
	    			comandos.add(new ComandoPase(nJug, 8));
	    		} else {
	    			comandos.add(disparar(miequipo[nJug],nJug));
	    		}
	    	} else if(nJug>0 && nJug<6){
	    		if(miequipo[nJug].getY()<0){
	    			comandos.add(new ComandoPase(nJug, 8));
	    		} else {
	    			comandos.add(new ComandoPase(nJug, 7));
	    		}
	    	
	    	}else{
	    		if(bola.getX()<100){     
			    		
			    		if(disentre<30 && Math.abs(bola.getY())<115 && suequipo[cJug].getX()>bola.getX()){
		        			if(suequipo[cJug].getY()>bola.getY()){
		        				comandos.add(new ComandoGolpearBola(nJug,bola.getX()+10,bola.getY()-30));
		        				
		        			} else {
		        				comandos.add(new ComandoGolpearBola(nJug,bola.getX()+10,bola.getY()+30));	
		        				
		        			}
		        		
		        		} else {
		        			
		        			comandos.add(new ComandoGolpearBola(nJug,bola.getX()+30,bola.getY()));
		        			
		        		}
			    		comandos.add(new ComandoIrA(10,nValores[10][0]+4,nValores[10][1]-3));
        				comandos.add(new ComandoIrA(9,nValores[9][0]+4,nValores[9][1]+3));
			    		asignado.put(9,"9");
			    		asignado.put(10,"10");
			        	
			        } else {
			        	if(Math.abs(bola.getY())<90){        		
			        		
			        		if(bola.getY()<0){
			        			comandos.add(new ComandoPase(nJug, 10));
			        			comandos.add(new ComandoIrA(10,bola.getX(),bola.getY()));
			        			comandos.add(disparar(miequipo[10],10));
			        			comandos.add(new ComandoIrA(10,bola.getX(),bola.getY()));
			        			
					    		asignado.put(10,"10");
			        		} else {
			        			comandos.add(new ComandoPase(nJug, 9));
			        			comandos.add(new ComandoIrA(9,bola.getX(),bola.getY()));
			        			comandos.add(disparar(miequipo[9],9));
				        		comandos.add(new ComandoIrA(9,bola.getX(),bola.getY()));
				        		asignado.put(9,"9");
			        		}
			        		comandos.add(new ComandoIrA(nJug,bola.getX(),bola.getY()));
			        	} else {
			        		
			        		if(bola.getY()>0){
			        			
    		        				comandos.add(new ComandoGolpearBola(nJug,bola.getX()+10,bola.getY()-30));
    		        			} else {
    		        				comandos.add(new ComandoGolpearBola(nJug,bola.getX()+10,bola.getY()+30));	        				
    		        			}
			        		comandos.add(new ComandoIrA(10,nValores[10][0],nValores[10][1]-3));
	        				comandos.add(new ComandoIrA(9,nValores[9][0],nValores[9][1]+3));
	        				asignado.put(9,"9");
				    		asignado.put(10,"10");
			        		
			            	}
			        	}
			        }
	    	
    
    	
	    	
    	 for(int n=0;n<11;n++){
            
                 	if(sj.getContrario()[n].getX()<0){
                     int defMasCercano = getDefensaMasCerca(miequipo,sj.getContrario()[n].getX(),sj.getContrario()[n].getY(),nJug,asignado,jugador);
                     asignado.put(defMasCercano,""+defMasCercano);                     
	                    
	                         if(bola.getX() < sj.getContrario()[n].getX()){
	                         	if(bola.getY() > 0){
	                         		if(bola.getY() > sj.getContrario()[n].getY()){
	                         			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() - 6,sj.getContrario()[n].getY()+3));
	                         		}else{
	                         			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() - 6,sj.getContrario()[n].getY()-3));
	                         		}
	                         	}else{
	                         		if(bola.getY() < sj.getContrario()[n].getY()){
	                         			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() - 6,sj.getContrario()[n].getY()-3));
	                         		}else{
	                         			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() - 6,sj.getContrario()[n].getY()+3));
	                         		}
	                         	}
	                         }else{
	                             if(bola.getY() > 0){
	                         		if(bola.getY() > sj.getContrario()[n].getY()){
	                         			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() + 6,sj.getContrario()[n].getY()+3));
	                         		}else{
	                         			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() + 6,sj.getContrario()[n].getY()-3));
	                         		}
	                         	}else{
	                         		if(bola.getY() < sj.getContrario()[n].getY()){
	                         			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() + 6,sj.getContrario()[n].getY()-3));
	                         		}else{
	                         			comandos.add(new ComandoIrA(defMasCercano, sj.getContrario()[n].getX() + 6,sj.getContrario()[n].getY()+3));
	                         		}
	                         	}
	                         }
	                    
                     }
                 	
           
             
         }
    	 for (int n=0;n<11;n++){
         	if(nJug!=n && n!=jugador && !asignado.containsKey(n)){
         		comandos.add(new ComandoIrA(n, nValores[n][0], nValores[n][1]));
         		 
         	}
         }
    	 int disX=new Double(bola.getX()-miequipo[nJug].getX()).intValue();
    	 int disY=new Double(bola.getY()-miequipo[nJug].getY()).intValue();
    	
        
        return comandos;
	}
	public int mascercano(Point miequipo[]){
		int jug =10;
		for(int i=0;i<11;i++){
			if(miequipo[i].getX()>miequipo[jug].getX()){
				jug=i;
			}
		}
		return jug;
	}
	public int jugadorPositivoMasCercano(Point miequipo[],int jug){
		int resultado=10;
		double distancia =500;
		for(int j=1;j<11;j++){
			double dis2 = General.getDistancia(miequipo[jug].getX(),miequipo[jug].getY(),miequipo[j].getX(),miequipo[j].getY());
			if(jug!=j && distancia>dis2 && dis2>40 && miequipo[jug].getX()<miequipo[j].getX()){
				distancia=dis2;
				resultado=j;
			}
		}		
		return resultado;
	}
	
	public int jugadorMasCercano(Point miequipo[],int jug){
		int resultado=10;
		double distancia =500;
		for(int j=1;j<11;j++){
			double dis2 = General.getDistancia(miequipo[jug].getX(),miequipo[jug].getY(),miequipo[j].getX(),miequipo[j].getY());
			if(jug!=j && distancia>dis2){
				distancia=dis2;
				resultado=j;
			}
		}		
		return resultado;
	}
	public int jugadorMasCercanoBola(Point miequipo[],Point bola){
		int resultado=10;
		double distancia =500;
		for(int j=1;j<11;j++){
			double dis2 = General.getDistancia(bola.getX(),bola.getY(),miequipo[j].getX(),miequipo[j].getY());
			if(distancia>dis2){
				distancia=dis2;
				resultado=j;
			}
		}		
		return resultado;
	}
	
	public int getDefensaMasCerca(Point miequipo[],double x,double y,int nJug,Hashtable asignado,int jugInter){
		int jugador=1;
		double distancia =500;
		for(int p=1;p<7;p++){
			if(!asignado.containsKey(p) && p!=nJug && p!=jugInter){
				double dis2 = General.getDistancia(x,y,miequipo[p].getX(),miequipo[p].getY());
				if(distancia>dis2){
					distancia=dis2;
					jugador=p;
				}
			}
		}
		
		return jugador;
	}
	public Comando disparar(Point pos ,int jug){
		if(pos.getY()<0)
			return 	new ComandoTiroAPuerta(jug,-5);
		else 
			return 	new ComandoTiroAPuerta(jug,5);
	}
	public Comando despejar(Point pos ,int jug){
		if(pos.getY()<0)
			return 	new ComandoTiroAPuerta(jug,-120);
		else 
			return 	new ComandoTiroAPuerta(jug,120);
	}
}